import type { ConstructorOf } from '../../../../wing/assets/src';
import { Manager } from './Manager';
import { AssetCache, BaseStage } from '../view/BaseStage';
import { app } from '../application';

/**
 * - 作者: DoooReyn
 * - 日期: 2023.10.31
 * - 名称: Stage
 * - 描述: 舞台管理器
 */
export class Stage extends Manager {
    /** 当前舞台 */
    protected _stage: BaseStage | null = null;

    public get uname(): string {
        return 'Stage';
    }

    protected async onInit(): Promise<void> {}

    protected async onDeinit(): Promise<void> {}

    /** 缓存 */
    public get cache(): AssetCache | null {
        return this._stage;
    }

    /**
     * 进入场景
     * @param stage 舞台
     * @param sceneInfo 场景信息
     * @returns
     */
    public async enter(stage: ConstructorOf<BaseStage>) {
        if (this._stage) {
            if (this._stage instanceof stage) {
                // 已经是当前场景就不需要再进入了
                this.logger.debug(`${this._stage.sceneInfo.scene} 已在场上！`);
                return;
            }

            // 离开当前场景
            await this.exit();
        }

        // 还原页面初始化时的状态
        await app.view.restore();

        // 添加新场景
        this._stage = new stage();

        this.logger.debug(`${this._stage.sceneInfo.scene} 正在加载场地！`);
        await this._stage.onLoad();

        this.logger.debug(`${this._stage.sceneInfo.scene} 场地准备就绪！`);
        await this._stage.onReady();

        this.logger.debug(`${this._stage.sceneInfo.scene} 准备进场！`);
        await this._stage.onTransitionEnter();

        this.logger.debug(`${this._stage.sceneInfo.scene} 正在初始化！`);
        await this._stage.onEnter();

        this.logger.debug(`${this._stage.sceneInfo.scene} 已经进场！`);
    }

    /** 退出当前场景 */
    public async exit() {
        // 清理视图
        await app.view.clear();

        if (this._stage) {
            this.logger.debug(`${this._stage.sceneInfo.scene} 正在清理场地！`);
            await this._stage.onUnload();

            this.logger.debug(`${this._stage.sceneInfo.scene} 准备离场！`);
            await this._stage.onTransitionExit();

            this.logger.debug(`${this._stage.sceneInfo.scene} 正在离场！`);
            await this._stage.onExit();

            this.logger.debug(`${this._stage.sceneInfo.scene} 已经离场！`);
            this._stage = null;
        }
    }
}
